// 此处代码测试都在 jsperf.com网站进行

// 全局变量，和局部变量共用
var i,str=0
for(i=0;i<1000;i++){
    str += i
}
for(let i=0;i<1000;i++){
    let str = ''
    str += i
    // console.log(str)
}
console.log(str)


// 避免属性方法的使用
// before
function Person(){
    this.name = 'Tom'
    this.age = 18
    this.getName = function(){
        return this.name
    }
}
const p = new Person()
console.log(p.getName()) // 性能差
// after
console.log(p.name) // 更快


// for 循环的优化
let sum = 0
const arr = []
for(let i=0;i<1000;i++){
    arr.push(Math.floor(Math.random()*100))
}
// console.log(new Date())
// before
for(let i=0;i<arr.length;i++){
    sum += arr[i]
}
// after:数据量小的时候，两者之间的性能比较不是特别明显。但当arr的长度足够长，或者arr中的元素足够复杂(比如是node节点)，用len存储arr的长度，可以减少arr长度的计算，提高性能。
for(let i=0,len=arr.length;i<len;i++){
    sum += arr[i]
}
// console.log(sum,new Date())

// 减少判断嵌套
function dealing(part,num){
    const parts = ['es6','js','html','css']
    if(part){
        if(parts.includes(part)){
            if(num>3){
                console.log('您需开通VIP才能观看此模块')
            }
        }else{
            console.log('未查询到该模块')
        }
    }else{
        console.log('请先确认模块')
    }
}
function dealing(part,num){
    const parts = ['es6','js','html','css']
    if(!part){
        console.log('请先确认模块')
        return
    }
    if(!parts.includes(part)){
        console.log('未查询到该模块')
        return
    }
    if(num>3){
        console.log('您需开通VIP才能观看此模块')
    }
}

// 减少作用域链查找层级
let name = 'Tom'
function foo(){
    name = 'tom111'
    function bar(){
        let age = 18
        console.log(age)
        console.log(name)
    }
    bar()
}
foo()
// after
let name = 'Tom'
function foo(){
    let name = 'tom111'
    function bar(){
        let age = 18
        console.log(age)
        console.log(name)
    }
    bar()
}
foo()

// 减少数据读取次数
